package com.shop.cereshop.app.service.nearbyUser;

import org.springframework.data.geo.GeoResult;
import org.springframework.data.geo.Metric;
import org.springframework.data.redis.connection.RedisGeoCommands;

import java.util.List;

/**
 * 附近用户服务
 */
public interface NearbyUserService {
    /**
     * 更新用户地理位置
     *
     * @param userId    用户ID
     * @param longitude 经度
     * @param latitude  纬度
     */
    Long updateUserLocation(Long userId, Double longitude, Double latitude);

    /**
     * 查询附近的人 (基于点和半径)
     *
     * @param longitude 当前经度
     * @param latitude  当前纬度
     * @param distance  距离
     * @param unit      单位 (e.g., Metrics.KILOMETERS)
     * @return 附近的人列表（包含距离和坐标）
     */
    public List<GeoResult<RedisGeoCommands.GeoLocation<String>>> findNearby(Double longitude, Double latitude, Double distance, Metric unit);


    /**
     * 查询附近的人 (基于某个用户)
     *
     * @param userId   目标用户ID
     * @param distance 距离
     * @param unit     单位
     * @return 附近的人列表
     */
    public List<GeoResult<RedisGeoCommands.GeoLocation<String>>> findNearbyByUserId(Long userId, Double distance, Metric unit);

    /**
     * 删除用户地理位置
     *
     * @param userId 用户ID
     */
    public void removeUserLocation(Long userId);

    /**
     * 获取指定用户当前坐标的 geohash
     *
     * @param userId 用户ID
     * @param length geohash长度（常用1-12），建议9位存储
     * @return geohash，若无坐标数据返回null
     */
    String getUserGeoHash(Long userId, int length);

    /**
     * 判断用户是否在线（依据最近一次位置更新时间）
     * @param userId 用户ID
     * @param thresholdMs 判定在线的阈值（毫秒）
     * @return true-在线；false-离线
     */
    boolean isOnline(Long userId, long thresholdMs);

}
